//
//  HomeViewController.swift
//  上海微博
//
//  Created by teacher on 16/2/21.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import YYModel
import AFNetworking

/// 微博 Cell 可重用标识符号
private let CZStatusCellID = "CZStatusCellID"
/// 微博提示 Cell 可重用标识符号
private let CZStatusTipCellID = "CZStatusTipCellID"

class HomeViewController: RootViewController {

    override func viewDidLoad() {
        
        // 设置刷新控件
        setupRefreshControl()

        // 调用 RootViewController 的 viewDidLoad 函数，会直接调用 loadData
        super.viewDidLoad()
        //准备表格视图
        setparabiaoge()
        
        // 设置访客视图信息 - 如果用登录成功，访客视图为 nil，什么也不做！
        visitorView?.setupInfo(message: "关注一些人，回这里看看有什么惊喜")
        
        // 注册网络连接监听
        NSNotificationCenter.defaultCenter().addObserver(
            self,
            selector: "reachabilityChanged",
            name: AFNetworkingReachabilityDidChangeNotification,
            object: nil)
    }
    
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(
            self,
            name: AFNetworkingReachabilityDidChangeNotification,
            object: nil)
    }

    /// 接收到内存警告！
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
        // On iOS 6.0 it will no longer clear the view by default.
        // 在 iOS 6.0 之后，默认不再清除 view，再 iOS 6.0 之前，收到内存警告后
        // `如果视图当前没有显示`，会被从内存中销毁，下次需要使用的时候，会再次调用 loadView 创建 view
        // 只需要释放能够被再次创建的资源，例如：从网络加载的数据数组
        // 图像的内存管理 SDWebImage 自行管理，会释放内存中的图像，下次使用，会重新从磁盘缓存加载，如果瓷盘缓存没有，下载图片
        
        print("Home 的 window \(self.view.window)")
        // 如果视图当前正在显示，window 不为nil
        // 注意：Swift 中 lazy 的属性 ** 千万不要设置成 nil！！！
        if self.view.window == nil {
            // 1. 清理数组
            self.statusList.removeAll()
            // 2. 刷新数据
            self.loadData()
        }
    }
    
    /// 网路连接状态监听方法
    @objc private func reachabilityChanged() {
        // 刷新表格的第一个分组 
        self.tableView?.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
    }
    
    override func loadData() {
        
        // 1. 判断是否是上拉刷新，如果上拉刷新动画启动，认为是上拉刷新
        let isPullup = refreshControl?.isPullupRefresh ?? false
        
        // 显示刷新控件
        refreshControl?.beginRefreshing()
        
        // 下拉刷新索引 - 取数组第一项 id
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        // 上拉刷新索引 - 去数组最后一项 id
        let max_id = !isPullup ? 0 : (statusList.last?.status.id ?? 0)
        
        // 加载微博数据
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result) -> () in
            
            // 结束刷新
            self.refreshControl?.endRefreshing()
            
            // [String: AnyObject] => [[String: AnyObject]]
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("您的网路不给力")
                return
            }
            // 遍历数组，字典转`模型`
            var arrayM = [StatusViewModel]()
            for dict in array {
                arrayM.append(StatusViewModel(status: Status.yy_modelWithJSON(dict)))
            }
//            for e in arrayM{
//                print(e.status.pic_urls)
//            }
            print(arrayM)
            print("本次刷新数据条数 \(arrayM.count)")
            
            // 如果是上拉刷新，将刷新的数组放在后面
            if max_id > 0 {
                self.statusList += arrayM
            } else {
                self.statusList = arrayM + self.statusList
            }
            
            // 刷新数据
            self.tableView?.reloadData()
        }

    }
    
    // MARK: - 私有属性
//    private lazy var statusList = [Status]()
    //微博视图模型
    private lazy var statusList = [StatusViewModel]()
    
}
// MARK: - 准备表格视图
extension HomeViewController {
    func setparabiaoge()  {
        // 注册可重用 cell
        tableView?.registerClass(StatusCell.self, forCellReuseIdentifier: CZStatusCellID)
        tableView?.registerClass(StatusTipCell.self, forCellReuseIdentifier: CZStatusTipCellID)
        // 设置预估行高的用处：
        // 1. 用数据源行数 * estimatedRowHeiht => contentSize，保证表格能够滚动
        tableView?.estimatedRowHeight=200
        // 2. 设置行高是自动计算，调用数据源方法的时候，会根据 cell 的布局内容计算行高，动态更改 contentSize 的 height
        tableView?.rowHeight=UITableViewAutomaticDimension
        
        //取消分割线
        tableView?.separatorStyle = .None
    }
}

// extension 本身是对本类的一个扩展，方法的优先级相对较低，本质上，应该不隶属于本类
// MARK: - UITableViewDataSource
// Redundant conformance of 'HomeViewController' to protocol 'UITableViewDataSource'
// 如果父类已经遵守协议，子类不用再次遵守协议，否则会报 重复遵守协议 错误
extension HomeViewController {
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }
    /// 重写数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        // 分组 0 对应的是提示 cell，如果（网络连接没有）需要提示，才返回 1
        if section == 0 {
            return NetworkTools.sharedTools.reachable ? 0 : 1
        }
        
        // 分组 1 对应正常的微博 cell
        return statusList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 分组 0 对应的是提示 cell
        if indexPath.section == 0 {
            return tableView.dequeueReusableCellWithIdentifier(CZStatusTipCellID, forIndexPath: indexPath)
        }
        
        // 分组 1，对应正常的微博 Cell
        let cell = tableView.dequeueReusableCellWithIdentifier(CZStatusCellID, forIndexPath: indexPath) as! StatusCell
        //获取视图模型
        let status = statusList[indexPath.row]
        //给cell赋值
        cell.statusView=status
        return cell
    }
}
